Background

In our previous work, we analysed the factors that drive reduced prediction accuracy of polygenic scores for height in individuals with African ancestry.

We saw that SFS and LD play a role, but there is also suggestive evidence that differences in marginal effect sizes exist.

In that study we ran a GWAS in ~8,000 individuals with African ancestry from the UKBB and tested for differences in marginal effect sizes between those and European derived effect sizes, as well as correlations of those differences with allelic frequency differences. Finally, we implemented ancestry-informed PRSs in the admixed individuals, and observed only very modest improvement in prediction accuracy.

It is possible that that modest improvement was due to our low sample size. So here we use a much larger sample size (about 58K African ancestry individuals and 91K total) to explore the potential of ancestry-informed PRSs for height. We also try a larger meta-analysis, with 58K African ancestry individuals and

Another interesting thing is to see whether by fine-mapping index variants by including African ancestry we can select SNPs that yield better PRS performance.

Questions:

  1. Do multi-PRS and LA-PRS increase in prediction by using effect-sizes from a meta-African analysis? What about a meta-Pan analysis?

  2. What is the overlap between GWAS hits between GWAS for EUR only and BBJ only, AFR only and combinations of those?

  3. When we select ancestry-specific index variants and then use those in the PRS, does prediction improve?

Methods

For now, we are focusing on height only.

GWAS summary statistics

We use GWAS summary statistics for height from six sources::

*UKBB_eur: UK Biobank Europeans

*BBJ: Biobank Japan

*Uganda Genome Project - which is a meta-analysis of Uganda + 3 other populations from Africa, described in the Uganda Genome Project paper);

  • UKBB_afr- from the African subset from the panUKBB dataset.

  • N’diaye et al. 2011 - still the largest height GWAS performed in African ancestry individuals;

  • PAGE, a large meta-analysis including 35% African Americans and the remaining participants are mostly of Hispanic/Latino and other minority ancestries.

So our meta-AFR analysis includes: PAGE, Ndiaye, UKBB_afr and 4 cohorts from UGP.

Our meta-all analysis includes: meta-AFR, UKBB_eur, BBJ.

Meta-analysis in METAL

We performed two meta-analysis:

*meta-AFR: UGP+pan-UKBB(AFR)+N’Diaye et al. 2011 meta-analysis, PAGE project. Total of 90,970 individuals (58488 of African ancestry). See Table 1.

*meta-ALL: Our meta-ALL analysis includes: UKBB_eur, meta-AFR (previous step), BBJ (Biobank Japan, N=159,095) Total of 610,453 (58488 of African ancestry). See Table 1.

Note that both have the same amount of African ancestry individuals (N=XX). We performed meta-ALL to check whether bigger sample size and increased diversity in the discovery cohort would improve predictions.

We ran a meta-analysis using METAL using one file for each of the above datasets. We set genomic correction to “ON”, meaning it is performed for each file (not the final values). We performed the meta-analysis using SCHEME STDERR, meaning betas and SE are used. For the meta-AFR analysis, we set AVERAGEFREQ and MINMAXFREQ to “ON” so that metal can track large allelic frequency differences across datasets as suggestion of allelic mismatch. We only report results for variants that have a combined weight of at least 49,781 (meta-AFR) or 590026 individuals, resulting in about 20 million autosomal variants in both datasets.

We inspected the p-value distribution of these meta-analyses using QQ-plots and calculated the genomic inflation on the final p-values, and performed corrections accordingly.

Data QC

Summary statistics QC

Most were in hg19 build, except N’diaye, which we lift over from hg18 to hg19. Previous filtering was done in each of these studies, and there is often not enough information for us to perform our own filtering.

  • UGP: this is very recent. They filtered for imputation score > 0.3.

  • pan-UKBB: They filter for INFO scores > 0.8 and minimum allele count of 20 in each population. They also provide a True/False filter for “low_quality_AFR” which we use, retaining only those for which it is ‘false’. GWAS included: Age, sex, Age*sex, Age2, Age2*sex, the first 10 PCs. Inverse-normal transformation of height in cm.

  • N’diaye et al.: The genomic control inflation (GC) factor was calculated for each study and used for within-study correction, prior to the meta-analysis. The overall lambda they report is 1.064 (which we confirm, see table below) suggesting no inflation in this meta-analysis. Imputation info score not available, but authors filtered for >= 0.3. Betas and SE in units of z-score.

PAGE: inverse-normal-adjusted residuals for each trait outcome. Info score available. Filtered for > 0.4 by authors prior. We were more strict and filtered for > 0.8.

As mentioned, for the meta-analyses summary statistics we only retained positions for which there was information for most individuals in the meta-analysis (20.7 and 23.7 M SNPs for meta-AFR and meta-ALL respectively).

For UKBB_eur, we retained only SNPs with INFO> 0.8 (11.9 M SNPs) and low_quality_variant=FALSE (15.4 M SNPs). Only autosomal SNPs were analyzed.

LD reference panels

For PRS using summary statistics from the UKBB_eur, we used the UKBB_eur (5,000 randomly sampled) imputed data as LD reference panel.For PRS using the BBJ summary statictics, we used a combination of the 1000G Phase 3 East Asians and UKBB Chinese individuals. For the meta-AFR summary statistics, we used a combination of UKBB_afr and 1000G Phase 3 African ancestry individuals. For the meta-ALL summary statistics, we used a combination of all Phase 3 1000G individuals, the UKBB_eur, UKBB_afr, and UKBB_chi. In all cases, the combined sets were QC’d to only include unrelated individuals (plink –rel-cutoff 0.125) and with genotype missingness < 0.85. We further restricted these sets to SNPs with MAF > 0.001. We further removed SNPs with allelic mismatch with the UKBB_EUR summary statistics file and corrected for strand flipping when appropriate.

Test data

For test data, we used the Penn Biobank subsets of European American and African American individuals (Table XX), the HRS subsets of European and African Americans, and the UKBB Chinese individuals (Table XX). Individuals with height further than two deviations from the sex-cohort specific mean were not included. (Table 3)

Test cohorts

Genotype data from test cohorts was lifted over to hg38 when needed.

  • PMBB (Penn Biobank): with sets of EUR (7501) and AFR ancestry individuals (9226)

  • UKB_CHI (UKBB Chinese): a set of 1,504 individuals with Chinese ancestry from the UK Biobank.

  • HRS (Health and Retirement Study): with sets of EUR (10,486) and AFR (2,322) ancestry individuals.

We visually inspected qq-plots of height residuals for each dataset to check for extreme outliers. Based on this inspection, we restricted PMBB (Figs 3-4 for before and after filtering) and HRS (Figs 5-6 for before and after filtering) samples to those for which residual height was between \(\pm3\) standard deviations from the mean for each sex. For UKB-CHI, no filtering was necessary (Fig 7). Height residuals were obtained by regressing height on all co-variates and their interactions for each individual:

\[height\sim Sex+Age+Age^2+Sex*Age+Sex*Age^2+pEUR+Sex*pEUR+Age*pEUR+Age^2*pEUR\]

, where \(p_{EUR}\) is the genome-wide average proportion of European ancestry for PMBB_afr and HRS_afr (estimated through RFMIx), and the European ancestry component (estimated through unsupervised ADMIXTURE with k=2) for UKB_CHI. For HRS_eur and PMBB_eur, we set \(p_{EUR}\) to 1.

When multiple time points were available for each individual, we retained the one corresponding to the latest height measure and age. All height phenotype data was formatted to be in centimeters.

Each test cohort was randomly divided into a “train” and a “test” set following the ratio of 0.15 (train) and 0.85 (test) for most datasets, except for UKB_CHI and HRS_afr, where we used 0.20:0.80 (Table 2). We performed a stratified split of the data using the initial_split function from the rsample R package. We used ‘Sex’ as strate, i.e, to maintain Sex proportions within training and testing sets similar (Table 2)

PRS calculations

We used LDpred for PRS calculations. For UKBB_eur summary statistics, we used the UKBB_eur as LD reference panel; for BBJ and meta-AFR we used East Asians and Africans from 1000G Phase 3, respectively. We first ran ldpred coord to coordinate the summary statistics, test and LD datasets. Next we ran the gibbs sampler. Many values of p did not covnerge, but typically p=1 and p=0.3 did converge, so we looked at those, as well as the infinitesimal model. See Table

PRS_eur: PRS using effect sizes (\(\beta\)) from UKBB_eur.

PRS_eas: PRS using effect sizes (\(\beta\)) from BBJ (all East Asian).

PRS_afr: PRS using effect sizes ((\(\beta\)) from the meta-AFR GWAS.

PRS_all: PRS using effect sizes ((\(\beta\)) from the meta-ALL GWAS.

  1. A simple linear regression model

\[height~Sex+Age+Age2+pEUR\]

\[height~Sex+Age+Age2+pEUR+PRS_{eur}\]

  1. PRS1_ML (described in Marquez-Luna et al. 2017 and Bitarello & Mathieson 2020)

  2. PRS2_BD - linear combination of PRS described in Bitarello & Mathieson 2020

LS0tCnRpdGxlOiAiSGVpZ2h0IE1ldGEtYW5hbHlzaXMgZm9yIEFmcmljYW4gYW5jZXN0cnkiCm91dHB1dDoKICBodG1sX2RvY3VtZW50OgogICAgZGZfcHJpbnQ6IAogIHBkZl9kb2N1bWVudDogZGVmYXVsdAogIGh0bWxfbm90ZWJvb2s6IGRlZmF1bHQKICBmaWdfY2FwdGlvbjogeWVzCi0tLQpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GfQpsaWJyYXJ5KGZsZXhkYXNoYm9hcmQpCmxpYnJhcnkoZGF0YS50YWJsZSkKbGlicmFyeShEVCkKbGlicmFyeShkcGx5cikKbGlicmFyeSh0aWR5cikKbGlicmFyeShyZWFkcikKbGlicmFyeShnZ3Bsb3QyKQpsaWJyYXJ5KGNhcHRpb25lcikKI2xpYnJhcnkoJ0dXQVNUb29scycpCmxpYnJhcnkocXFtYW4pCmxpYnJhcnkoYmlnc25wcikKbGlicmFyeShrYWJsZUV4dHJhKQpsaWJyYXJ5KCJ3ZXNhbmRlcnNvbiIpCmxpYnJhcnkocm1hcmtkb3duKQpsaWJyYXJ5KCdtYW5oYXR0YW5seScpCmxpYnJhcnkocGxvdGx5KQpsaWJyYXJ5KCdDYWlybycpCmtuaXRyOjpvcHRzX2NodW5rJHNldChjYWNoZT1UUlVFLCBlcnJvcj1GQUxTRSwgZmlnLmNhcCA9ICIgIiwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSkKYGBgCgpgYGB7ciwgY2h1bms9J1IyX3RhYmxlJywgb3V0LmhlaWdodCA9ICI0NjBweCIsb3V0LndpZHRoPSI2NjBweCIsZWNobz1GQUxTRSwgZXZhbD1ULCBmaWcuY2FwPSJGaWcgMTogUHJvcG9ydGlvbiBvZiB2YXJpYW5jZSBleHBsYWluZWQuIExEcHJlZC1JbmYgd2l0aCBzdW1hbXJ5IHN0YXRpc3RpY3MgZnJvbSBVS0JCLCBCQkosIG1ldGEtQUZSLCBhbmQgbWV0YS1BTEwuIEJvb3Ryc3RyYXAgY29uZmlkZW5jZSBpbnRlcnZhbHMgKG49MSwwMDApIn0KZHQ9ZnJlYWQoJ2xkcHJlZF90YWJsZV9yYWRpdXMxMDAwLnR4dCcpCmR0WyxOOj1pZmVsc2UoU3VtbWFyeV9TdGF0cz09J1BSU19VS0JCJywzNjAzODgsIGlmZWxzZShTdW1tYXJ5X1N0YXRzPT0nUFJTX0JCSicsMTU5MDk1LCBpZmVsc2UoU3VtbWFyeV9TdGF0cz09J1BSU19QQUdFJyw0OTc4MSwgaWZlbHNlKFN1bW1hcnlfU3RhdHM9PSdQUlNfR0lBTlQnLCAiNTAwMDMtMjUzMjgwIiwgaWZlbHNlKFN1bW1hcnlfU3RhdHM9PSdQUlNfTUVUQV9BRlInLCA0MTEwOSwgaWZlbHNlKFN1bW1hcnlfU3RhdHM9PSdQUlNfTUVUQV9BRlIyJywiODQzMzQtOTA4OTAiLCBpZmVsc2UoU3VtbWFyeV9TdGF0cz09J1BSU19NRVRBX05FQScsICIyMDg4NzYtMjQ5OTg1IiwgaWZlbHNlKFN1bW1hcnlfU3RhdHM9PSJQUlNfTUVUQV9FVVIiLCAiNDEwMzkxLTYxMzY2NyIsIGlmZWxzZShTdW1tYXJ5X1N0YXRzPT0iUFJTX01FVEFfQUxMIiwgIjQxMDE2OS02MTAzNzMiLCAiNjYwMDAxLTY2MDAxOSIpKSkpKSkpKSldCmR0JFN1bW1hcnlfU3RhdHM8LWZhY3RvcihkdCRTdW1tYXJ5X1N0YXRzKQpsaWJyYXJ5KGZvcmNhdHMpCnAyPC1kdCAlPiUgbXV0YXRlKFRlc3QgPSBmY3RfcmVvcmRlcihUZXN0X0RhdGEscEVVUikpICU+JSBtdXRhdGUoU3VtbWFyeV9TdGF0cz1mY3RfcmVvcmRlcihTdW1tYXJ5X1N0YXRzLCBOKSkgJT4lCmdncGxvdChhZXMoeD1UZXN0LCB5PVIyLGNvbG9yPVN1bW1hcnlfU3RhdHMsIEdyb3VwPXBFVVIpKSArCmdlb21fcG9pbnQoc2l6ZT00LCBhbHBoYT0wLjcsIHdpZHRoPTAuNCwgcG9zaXRpb249cG9zaXRpb25fZG9kZ2Uod2lkdGg9MC41KSkgKyAKZ2VvbV9lcnJvcmJhcihhZXMoeW1pbj1DSV9MLCB5bWF4PUNJX1UpLCB3aWR0aD0wLjEsIGxpbmV0eXBlID0gImRvdHRlZCIscG9zaXRpb249cG9zaXRpb25fZG9kZ2Uod2lkdGg9MC41KSkgKyAgICAgICAgCnNjYWxlX2NvbG9yX21hbnVhbChuYW1lPScnLHZhbHVlcyA9IGMod2VzX3BhbGV0dGUoIlJveWFsMiIsNSksd2VzX3BhbGV0dGUoIkRhcmplZWxpbmcxIiw1KSkpICsgCnRoZW1lX2J3KCkrIGxhYnMoeD0iVGVzdCBEYXRhc2V0Iix5PSJWYXJpYW5jZSBleHBsYWluZWQgKCUpIiwgdGl0bGU9IiIsIGNleD0zKQpnZ3Bsb3RseShwMikKCmBgYAoKCmBgYHtyLCBlY2hvPUZ9CmR0PC1mcmVhZCgnc3NfZGF0YXNldHMudHh0JykKZHRbLCBNYWluX2FuY2VzdHJ5Oj1jKCdBZnIrRXVyJywgJ0FmcicsJ0FmciwgQWZyK0V1cicsICdBZnIsIEFmcitFdXInLCAnQWZyK0V1cixMYXRpbm8sIG90aGVycycsICdBZnIsIEFmcitFdXIsIExhdGlubywgb3RoZXJzJywgJ0Vhc3QgQXNpYW4nLCAnRS4gQXNpYW4sQWZyK0V1ciwgQWZyLCBMYXRpbm8sIG90aGVycycsICdFdXInLCAnRXVyJywgJ0V1ciwgRS5Bc2lhbiwgQWZyLCBBZnIrRXVyLCBMYXRpbm8sIG90aGVycycsICdFdXInLCAnRXVyLCBFLkFzaWFuLCBBZnIsIEFmcitFdXIsIExhdGlubywgb3RoZXJzJyldCmR0WywgTERfcGFuZWxfbGRwcmVkOj1jKCJOL0EiLCJOL0EiLCAiTi9BIiwiMUtHUDNfYWZyKE49NjYwKSIsIjFLR1AzX25lYShOPTIwMDEpIiwgIjFLR1AzX25lYShOPTIwMDEpIiwgIjFLR1AzX2VhcyhOPTUwNCkiLCAiMUtHUDNfbmVhKE49MjAwMSkiLCAiVUtCX0VVUihOPTgwMDApIiwgIlVLQl9FVVIoTj04MDAwKSIsIjFLR1AzX2FsbChOPTI1OTgpIiwiVUtCX0VVUihOPTgwMDApIiwgIjFLR1AzX2FsbChOPTI1OTgpIildCgpteV90YWJsZTwtZGF0YXRhYmxlKGR0LG9wdGlvbnMgPSBsaXN0KHBhZ2VMZW5ndGggPSAxMyksIGNhcHRpb249IlRhYmxlIDEuIFN1bW1hcnkgc3RhdGlzdGljcyB1c2VkIGluIHRoaXMgc3R1ZHkuICogQWZyK0V1ciBtZWFucyB0d28gd2F5IGFkbWl4ZWQgaW5kaXZpZHVhbHMgKGFmciwgZXVyKTsgTGF0aW5vOiB0eXBpY2FsbHkgYWRtaXhlZCBpbnZpZHVhbHMgd2l0aCBBZnIsIEV1ciwgYW5kIE5hdGl2ZSBhbWVyaWNhbiBhbmNlc3RyaWVzLiIpCm15X3RhYmxlCiNrbml0cjo6a2FibGUoZHQsIGNhcHRpb249IlRhYmxlIDEuIFN1bW1hcnkgc3RhdGlzdGljcyB1c2VkIGluIG1ldGEtYW5hbHlzZXMuIikKYGBgCgoKYGBge3IsIGVjaG89Rn0KZHQ0PC1kYXRhLnRhYmxlKERhdGFzZXQ9YygnVUtCQl9jaGknLCAnUE1CQl9hZnInLCAnSFJTX2FmcicsICdQTUJCX2V1cicsICdIUlNfZXVyJyksIE49YygxNDY3LDg3MjYsMjI1MSw2NzA5LDEwMTU5KSwgU05Qc19VS0JCPWMoMTQ4NTIxLDE1NzE4NywxNjAzMjYsOTc1MDAyKSkKbXlfdGFibGU0PC1kYXRhdGFibGUoZHQ0LG9wdGlvbnMgPSBsaXN0KHBhZ2VMZW5ndGggPSAxMiksIGNhcHRpb249IlRhYmxlIDIuIFRlc3QgZGF0YSBwb3N0IGZpbHRlcmluZyIpCm15X3RhYmxlNAoja25pdHI6OmthYmxlKGR0LCBjYXB0aW9uPSJUYWJsZSAxLiBTdW1tYXJ5IHN0YXRpc3RpY3MgdXNlZCBpbiBtZXRhLWFuYWx5c2VzLiIpCmBgYAoKCgpgYGB7ciwgb3V0LndpZHRoID0gIjM2MHB4IixlY2hvPUZBTFNFLCBldmFsPVQsIGZpZy5jYXA9IkZpZyAyOiBRUS1wbG90IGZvciBtZXRhLUFGUi4gUC12YWx1ZXMgd2VyZSBHQyBjb3JyZWN0ZWQgd2l0aGluIGVhY2ggZGF0YXNldCwgYW5kIGZvciB0aGUgZmluYWwgbWV0YS1BRlIgYW5hbHlzaXMuIn0Ka25pdHI6OmluY2x1ZGVfZ3JhcGhpY3MoIlFDX0hFSUdIVF9NRVRBX0FGUjJfaGczOF9HQ19xcXBsb3QucG5nIikKYGBgCgpgYGB7ciwgb3V0LndpZHRoID0gIjM2MHB4IixlY2hvPUZBTFNFLCBldmFsPVQsIGZpZy5jYXA9IkZpZyAzOiBRUS1wbG90IGZvciBtZXRhLUFMTC4gUC12YWx1ZXMgd2VyZSBHQyBjb3JyZWN0ZWQgd2l0aGluIGVhY2ggZGF0YXNldCwgYW5kIGZvciB0aGUgZmluYWwgbWV0YS1BTEwgYW5hbHlzaXMuIn0Ka25pdHI6OmluY2x1ZGVfZ3JhcGhpY3MoIlFDX0hFSUdIVF9NRVRBX0FMTF9oZzM4X0dDX3FxcGxvdC5wbmciKQpgYGAKCgpgYGB7ciwgb3V0LndpZHRoID0gIjM2MHB4IixlY2hvPUZBTFNFLCBldmFsPVQsIGZpZy5jYXA9IkZpZyA0OiBRUS1wbG90IGZvciBVS0JCLiJ9CmtuaXRyOjppbmNsdWRlX2dyYXBoaWNzKCJRQ19IRUlHSFRfVUtCQl9oZzM4X0dDX3FxcGxvdC5wbmciKQpgYGAKCgpgYGB7ciwgb3V0LndpZHRoID0gIjM2MHB4IixlY2hvPUZBTFNFLCBldmFsPVQsIGZpZy5jYXA9IkZpZyA1OiBRUS1wbG90IGZvciBCQkouIn0Ka25pdHI6OmluY2x1ZGVfZ3JhcGhpY3MoIlFDX0hFSUdIVF9CQkpfaGczOF9HQ19xcXBsb3QucG5nIikKYGBgCgpgYGB7ciwgb3V0LndpZHRoID0gIjM2MHB4IixlY2hvPUZBTFNFLCBldmFsPVQsIGZpZy5jYXA9IkZpZyA2OiBVS0JCLUJCSiBjb21wYXJpc29uIn0Ka25pdHI6OmluY2x1ZGVfZ3JhcGhpY3MoIlVLQkJfQkJKX3NzX3BhbmVsLnBuZyIpCmBgYAoKYGBge3IsIG91dC53aWR0aCA9ICIzNjBweCIsZWNobz1GQUxTRSwgZXZhbD1ULCBmaWcuY2FwPSJGaWcgNzogVUtCQi1tZXRhQUZSIGNvbXBhcmlzb24ifQprbml0cjo6aW5jbHVkZV9ncmFwaGljcygiVUtCQl9NRVRBX0FGUl9zc19wYW5lbC5wbmciKQpgYGAKCmBgYHtyLCBvdXQud2lkdGggPSAiMzYwcHgiLGVjaG89RkFMU0UsIGV2YWw9VCwgZmlnLmNhcD0iRmlnIDg6IFVLQkItbWV0YUFGUjIgY29tcGFyaXNvbiJ9CmtuaXRyOjppbmNsdWRlX2dyYXBoaWNzKCJVS0JCX01FVEFfQUZSMl9zc19wYW5lbC5wbmciKQpgYGAKCmBgYHtyLCBvdXQud2lkdGggPSAiMzYwcHgiLGVjaG89RkFMU0UsIGV2YWw9VCwgZmlnLmNhcD0iRmlnIDk6IFVLQkItbWV0YUFMTCBjb21wYXJpc29uIn0Ka25pdHI6OmluY2x1ZGVfZ3JhcGhpY3MoIlVLQkJfTUVUQV9BTExfc3NfcGFuZWwucG5nIikKYGBgCgpgYGB7ciwgb3V0LndpZHRoID0gIjM2MHB4IixlY2hvPUZBTFNFLCBldmFsPVQsIGZpZy5jYXA9IkZpZyAxMDogbWV0YUFGUi1tZXRhQUxMIGNvbXBhcmlzb24ifQprbml0cjo6aW5jbHVkZV9ncmFwaGljcygiTUVUQV9BRlJfTUVUQV9BTExfc3NfcGFuZWwucG5nIikKYGBgCgpgYGB7ciwgb3V0LndpZHRoID0gIjM2MHB4IixlY2hvPUZBTFNFLCBldmFsPVQsIGZpZy5jYXA9IkZpZyAxMTogbWV0YUFGUjItbWV0YUFMTCBjb21wYXJpc29uIn0Ka25pdHI6OmluY2x1ZGVfZ3JhcGhpY3MoIk1FVEFfQUZSMl9NRVRBX0FMTF9zc19wYW5lbC5wbmciKQpgYGAKCmBgYHtyLCBvdXQud2lkdGggPSAiMzYwcHgiLGVjaG89RkFMU0UsIGV2YWw9VCwgZmlnLmNhcD0iRmlnIDEwOiBtZXRhQUZSLW1ldGFBRlIyIGNvbXBhcmlzb24ifQprbml0cjo6aW5jbHVkZV9ncmFwaGljcygiTUVUQV9BRlJfTUVUQV9BRlIyX3NzX3BhbmVsLnBuZyIpCmBgYAoKCmBgYHtyLCBlY2hvPUYsIGNodW5rPSdsZHByZWRfdGFibGVfcmFkaXVzMTAwMCd9CmR0PWZyZWFkKCdsZHByZWRfdGFibGVfcmFkaXVzMTAwMC50eHQnKQojZHRbLEFJQzo9cm91bmQoQUlDLDEpXSA3LzQKbXlfdGFibGUzPC1kYXRhdGFibGUoZHQsb3B0aW9ucyA9IGxpc3QocGFnZUxlbmd0aCA9IDEyKSxjYXB0aW9uPSJUYWJsZSAzLiBQcm9wb3J0aW9uIG9mIHZhcmlhbmNlIGV4cGxhaW5lZC4gTERwcmVkLUluZiB3aXRoIHN1bWFtcnkgc3RhdGlzdGljcyBmcm9tIFVLQkIsIEJCSiwgbWV0YS1BRlIsIGFuZCBtZXRhLUFMTC4gQm9vdHJzdHJhcCBjb25maWRlbmNlIGludGVydmFscyAobj0xLDAwMCkiKQoja25pdHI6OmthYmxlKGR0KQpteV90YWJsZTMKYGBgCmBgYHtyLCBjaHVuaz0nUjJfdGFibGUnLCBvdXQuaGVpZ2h0ID0gIjQ2MHB4IixvdXQud2lkdGg9IjY2MHB4IixlY2hvPUZBTFNFLCBldmFsPVQsIGZpZy5jYXA9IkZpZyA0OiBNYW5oYXR0YW4gcGxvdCJ9CiNtZXRhX2FmcjwtZnJlYWQoJ1FDX0hFSUdIVF9NRVRBX0FGUl9oZzM4LnR4dC5neicpCgoKYGBgCgoKCiMgQmFja2dyb3VuZAoKSW4gb3VyIHByZXZpb3VzIHdvcmssIHdlIGFuYWx5c2VkIHRoZSBmYWN0b3JzIHRoYXQgZHJpdmUgcmVkdWNlZCBwcmVkaWN0aW9uIGFjY3VyYWN5IG9mIHBvbHlnZW5pYyBzY29yZXMgZm9yIGhlaWdodCBpbiBpbmRpdmlkdWFscyB3aXRoIEFmcmljYW4gYW5jZXN0cnkuIAoKV2Ugc2F3IHRoYXQgU0ZTIGFuZCBMRCBwbGF5IGEgcm9sZSwgYnV0IHRoZXJlIGlzIGFsc28gc3VnZ2VzdGl2ZSBldmlkZW5jZSB0aGF0IGRpZmZlcmVuY2VzIGluIG1hcmdpbmFsIGVmZmVjdCBzaXplcyBleGlzdC4KCkluIHRoYXQgc3R1ZHkgd2UgcmFuIGEgR1dBUyBpbiB+OCwwMDAgaW5kaXZpZHVhbHMgd2l0aCBBZnJpY2FuIGFuY2VzdHJ5IGZyb20gdGhlIFVLQkIgYW5kIHRlc3RlZCBmb3IgZGlmZmVyZW5jZXMgaW4gbWFyZ2luYWwgZWZmZWN0IHNpemVzIGJldHdlZW4gdGhvc2UgYW5kIEV1cm9wZWFuIGRlcml2ZWQgZWZmZWN0IHNpemVzLCBhcyB3ZWxsIGFzIGNvcnJlbGF0aW9ucyBvZiB0aG9zZSBkaWZmZXJlbmNlcyB3aXRoIGFsbGVsaWMgZnJlcXVlbmN5IGRpZmZlcmVuY2VzLiBGaW5hbGx5LCB3ZSBpbXBsZW1lbnRlZCBhbmNlc3RyeS1pbmZvcm1lZCBQUlNzIGluIHRoZSBhZG1peGVkIGluZGl2aWR1YWxzLCBhbmQgb2JzZXJ2ZWQgb25seSB2ZXJ5IG1vZGVzdCBpbXByb3ZlbWVudCBpbiBwcmVkaWN0aW9uIGFjY3VyYWN5LgoKSXQgaXMgcG9zc2libGUgdGhhdCB0aGF0IG1vZGVzdCBpbXByb3ZlbWVudCB3YXMgZHVlIHRvIG91ciBsb3cgc2FtcGxlIHNpemUuIFNvIGhlcmUgd2UgdXNlIGEgbXVjaCBsYXJnZXIgc2FtcGxlIHNpemUgKGFib3V0IDU4SyBBZnJpY2FuIGFuY2VzdHJ5IGluZGl2aWR1YWxzIGFuZCA5MUsgdG90YWwpIHRvIGV4cGxvcmUgdGhlIHBvdGVudGlhbCBvZiBhbmNlc3RyeS1pbmZvcm1lZCBQUlNzIGZvciBoZWlnaHQuIFdlIGFsc28gdHJ5IGEgbGFyZ2VyIG1ldGEtYW5hbHlzaXMsIHdpdGggNThLIEFmcmljYW4gYW5jZXN0cnkgaW5kaXZpZHVhbHMgYW5kIAoKQW5vdGhlciBpbnRlcmVzdGluZyB0aGluZyBpcyB0byBzZWUgd2hldGhlciBieSBmaW5lLW1hcHBpbmcgaW5kZXggdmFyaWFudHMgYnkgaW5jbHVkaW5nIEFmcmljYW4gYW5jZXN0cnkgd2UgY2FuIHNlbGVjdCBTTlBzIHRoYXQgeWllbGQgYmV0dGVyIFBSUyBwZXJmb3JtYW5jZS4KClF1ZXN0aW9uczoKCjEpIERvIG11bHRpLVBSUyBhbmQgTEEtUFJTIGluY3JlYXNlIGluIHByZWRpY3Rpb24gYnkgdXNpbmcgZWZmZWN0LXNpemVzIGZyb20gYSBtZXRhLUFmcmljYW4gYW5hbHlzaXM/IFdoYXQgYWJvdXQgYSBtZXRhLVBhbiBhbmFseXNpcz8KCjIpIFdoYXQgaXMgdGhlIG92ZXJsYXAgYmV0d2VlbiBHV0FTIGhpdHMgYmV0d2VlbiBHV0FTIGZvciBFVVIgb25seSBhbmQgQkJKIG9ubHksIEFGUiBvbmx5IGFuZCBjb21iaW5hdGlvbnMgb2YgdGhvc2U/CgozKSBXaGVuIHdlIHNlbGVjdCBhbmNlc3RyeS1zcGVjaWZpYyBpbmRleCB2YXJpYW50cyBhbmQgdGhlbiB1c2UgdGhvc2UgaW4gdGhlIFBSUywgZG9lcyBwcmVkaWN0aW9uIGltcHJvdmU/CgojIE1ldGhvZHMKCkZvciBub3csIHdlIGFyZSBmb2N1c2luZyBvbiBoZWlnaHQgb25seS4KCiMjIEdXQVMgc3VtbWFyeSBzdGF0aXN0aWNzCldlIHVzZSBHV0FTIHN1bW1hcnkgc3RhdGlzdGljcyBmb3IgaGVpZ2h0IGZyb20gc2l4IHNvdXJjZXM6OgoKKlVLQkJfZXVyOiBVSyBCaW9iYW5rIEV1cm9wZWFucwoKKkJCSjogQmlvYmFuayBKYXBhbgoKKlVnYW5kYSBHZW5vbWUgUHJvamVjdCAtIHdoaWNoIGlzIGEgbWV0YS1hbmFseXNpcyBvZiBVZ2FuZGEgKyAzIG90aGVyIHBvcHVsYXRpb25zIGZyb20gQWZyaWNhLCBkZXNjcmliZWQgaW4gdGhlIFVnYW5kYSBHZW5vbWUgUHJvamVjdCBwYXBlcik7IAoKKiBVS0JCX2Fmci0gZnJvbSB0aGUgQWZyaWNhbiBzdWJzZXQgZnJvbSB0aGUgcGFuVUtCQiBkYXRhc2V0LgoKKiBOJ2RpYXllIGV0IGFsLiAyMDExIC0gc3RpbGwgdGhlIGxhcmdlc3QgaGVpZ2h0IEdXQVMgcGVyZm9ybWVkIGluIEFmcmljYW4gYW5jZXN0cnkgaW5kaXZpZHVhbHM7IAoKKiBQQUdFLCBhIGxhcmdlIG1ldGEtYW5hbHlzaXMgaW5jbHVkaW5nIDM1JSBBZnJpY2FuIEFtZXJpY2FucyBhbmQgdGhlIHJlbWFpbmluZyBwYXJ0aWNpcGFudHMgYXJlIG1vc3RseSBvZiBIaXNwYW5pYy9MYXRpbm8gYW5kIG90aGVyIG1pbm9yaXR5IGFuY2VzdHJpZXMuCgpTbyBvdXIgbWV0YS1BRlIgYW5hbHlzaXMgaW5jbHVkZXM6IFBBR0UsIE5kaWF5ZSwgVUtCQl9hZnIgYW5kIDQgY29ob3J0cyBmcm9tIFVHUC4gCgpPdXIgbWV0YS1hbGwgYW5hbHlzaXMgaW5jbHVkZXM6IG1ldGEtQUZSLCBVS0JCX2V1ciwgQkJKLgoKIyMgTWV0YS1hbmFseXNpcyBpbiBNRVRBTAoKV2UgcGVyZm9ybWVkIHR3byBtZXRhLWFuYWx5c2lzOgoKKm1ldGEtQUZSOiBVR1ArcGFuLVVLQkIoQUZSKStOJ0RpYXllIGV0IGFsLiAyMDExIG1ldGEtYW5hbHlzaXMsIFBBR0UgcHJvamVjdC4gVG90YWwgb2YgOTAsOTcwIGluZGl2aWR1YWxzICg1ODQ4OCBvZiBBZnJpY2FuIGFuY2VzdHJ5KS4gU2VlIFRhYmxlIDEuCgoqbWV0YS1BTEw6IE91ciBtZXRhLUFMTCBhbmFseXNpcyBpbmNsdWRlczogVUtCQl9ldXIsIG1ldGEtQUZSIChwcmV2aW91cyBzdGVwKSwgQkJKIChCaW9iYW5rIEphcGFuLCBOPTE1OSwwOTUpIFRvdGFsIG9mIDYxMCw0NTMgKDU4NDg4IG9mIEFmcmljYW4gYW5jZXN0cnkpLiBTZWUgVGFibGUgMS4KCk5vdGUgdGhhdCBib3RoIGhhdmUgdGhlIHNhbWUgYW1vdW50IG9mIEFmcmljYW4gYW5jZXN0cnkgaW5kaXZpZHVhbHMgKE49WFgpLiBXZSBwZXJmb3JtZWQgbWV0YS1BTEwgdG8gY2hlY2sgd2hldGhlciBiaWdnZXIgc2FtcGxlIHNpemUgYW5kIGluY3JlYXNlZCBkaXZlcnNpdHkgaW4gdGhlIGRpc2NvdmVyeSBjb2hvcnQgd291bGQgaW1wcm92ZSBwcmVkaWN0aW9ucy4KCldlIHJhbiBhIG1ldGEtYW5hbHlzaXMgdXNpbmcgTUVUQUwgdXNpbmcgb25lIGZpbGUgZm9yIGVhY2ggb2YgdGhlIGFib3ZlIGRhdGFzZXRzLiBXZSBzZXQgZ2Vub21pYyBjb3JyZWN0aW9uIHRvICJPTiIsIG1lYW5pbmcgaXQgaXMgcGVyZm9ybWVkIGZvciBlYWNoIGZpbGUgKG5vdCB0aGUgZmluYWwgdmFsdWVzKS4gV2UgcGVyZm9ybWVkIHRoZSBtZXRhLWFuYWx5c2lzIHVzaW5nIFNDSEVNRSBTVERFUlIsIG1lYW5pbmcgYmV0YXMgYW5kIFNFIGFyZSB1c2VkLiBGb3IgdGhlIG1ldGEtQUZSIGFuYWx5c2lzLCB3ZSBzZXQgQVZFUkFHRUZSRVEgYW5kIE1JTk1BWEZSRVEgdG8gIk9OIiBzbyB0aGF0IG1ldGFsIGNhbiB0cmFjayBsYXJnZSBhbGxlbGljIGZyZXF1ZW5jeSBkaWZmZXJlbmNlcyBhY3Jvc3MgZGF0YXNldHMgYXMgc3VnZ2VzdGlvbiBvZiBhbGxlbGljIG1pc21hdGNoLiBXZSBvbmx5IHJlcG9ydCByZXN1bHRzIGZvciB2YXJpYW50cyB0aGF0IGhhdmUgYSBjb21iaW5lZCB3ZWlnaHQgb2YgYXQgbGVhc3QgNDksNzgxIChtZXRhLUFGUikgb3IgNTkwMDI2IGluZGl2aWR1YWxzLCByZXN1bHRpbmcgaW4gYWJvdXQgMjAgbWlsbGlvbiBhdXRvc29tYWwgdmFyaWFudHMgaW4gYm90aCBkYXRhc2V0cy4gCgpXZSBpbnNwZWN0ZWQgdGhlIHAtdmFsdWUgZGlzdHJpYnV0aW9uIG9mIHRoZXNlIG1ldGEtYW5hbHlzZXMgdXNpbmcgUVEtcGxvdHMgYW5kIGNhbGN1bGF0ZWQgdGhlIGdlbm9taWMgaW5mbGF0aW9uIG9uIHRoZSBmaW5hbCBwLXZhbHVlcywgYW5kIHBlcmZvcm1lZCBjb3JyZWN0aW9ucyBhY2NvcmRpbmdseS4KCiMjIERhdGEgUUMKCiMjIFN1bW1hcnkgc3RhdGlzdGljcyBRQwoKTW9zdCB3ZXJlIGluIGhnMTkgYnVpbGQsIGV4Y2VwdCBOJ2RpYXllLCB3aGljaCB3ZSBsaWZ0IG92ZXIgZnJvbSBoZzE4IHRvIGhnMTkuIFByZXZpb3VzIGZpbHRlcmluZyB3YXMgZG9uZSBpbiBlYWNoIG9mIHRoZXNlIHN0dWRpZXMsIGFuZCB0aGVyZSBpcyBvZnRlbiBub3QgZW5vdWdoIGluZm9ybWF0aW9uIGZvciB1cyB0byBwZXJmb3JtIG91ciBvd24gZmlsdGVyaW5nLgoKKiBVR1A6IHRoaXMgaXMgdmVyeSByZWNlbnQuIFRoZXkgZmlsdGVyZWQgZm9yIGltcHV0YXRpb24gc2NvcmUgPiAwLjMuCgoqIHBhbi1VS0JCOiBUaGV5IGZpbHRlciBmb3IgSU5GTyBzY29yZXMgPiAwLjggYW5kIG1pbmltdW0gYWxsZWxlIGNvdW50IG9mIDIwIGluIGVhY2ggcG9wdWxhdGlvbi4gVGhleSBhbHNvIHByb3ZpZGUgYSBUcnVlL0ZhbHNlIGZpbHRlciBmb3IgImxvd19xdWFsaXR5X0FGUiIgd2hpY2ggd2UgdXNlLCByZXRhaW5pbmcgb25seSB0aG9zZSBmb3Igd2hpY2ggaXQgaXMgJ2ZhbHNlJy4gR1dBUyBpbmNsdWRlZDogQWdlLCBzZXgsIEFnZVwqc2V4LCBBZ2UyLCBBZ2UyXCpzZXgsIHRoZSBmaXJzdCAxMCBQQ3MuIEludmVyc2Utbm9ybWFsIHRyYW5zZm9ybWF0aW9uIG9mIGhlaWdodCBpbiBjbS4KCiogTidkaWF5ZSBldCBhbC46IFRoZSBnZW5vbWljIGNvbnRyb2wgaW5mbGF0aW9uIChHQykgZmFjdG9yIHdhcyBjYWxjdWxhdGVkIGZvciBlYWNoIHN0dWR5IGFuZCB1c2VkIGZvciB3aXRoaW4tc3R1ZHkgY29ycmVjdGlvbiwgcHJpb3IgdG8gdGhlIG1ldGEtYW5hbHlzaXMuIFRoZSBvdmVyYWxsIGxhbWJkYSB0aGV5IHJlcG9ydCBpcyAxLjA2NCAod2hpY2ggd2UgY29uZmlybSwgc2VlIHRhYmxlIGJlbG93KSBzdWdnZXN0aW5nIG5vIGluZmxhdGlvbiBpbiB0aGlzIG1ldGEtYW5hbHlzaXMuIEltcHV0YXRpb24gaW5mbyBzY29yZSBub3QgYXZhaWxhYmxlLCBidXQgYXV0aG9ycyBmaWx0ZXJlZCBmb3IgPj0gMC4zLiBCZXRhcyBhbmQgU0UgaW4gdW5pdHMgb2Ygei1zY29yZS4KClBBR0U6IGludmVyc2Utbm9ybWFsLWFkanVzdGVkIHJlc2lkdWFscyBmb3IgZWFjaCB0cmFpdCBvdXRjb21lLiBJbmZvIHNjb3JlIGF2YWlsYWJsZS4gRmlsdGVyZWQgZm9yID4gMC40IGJ5IGF1dGhvcnMgcHJpb3IuIFdlIHdlcmUgbW9yZSBzdHJpY3QgYW5kIGZpbHRlcmVkIGZvciA+IDAuOC4KCkFzIG1lbnRpb25lZCwgZm9yIHRoZSBtZXRhLWFuYWx5c2VzIHN1bW1hcnkgc3RhdGlzdGljcyB3ZSBvbmx5IHJldGFpbmVkIHBvc2l0aW9ucyBmb3Igd2hpY2ggdGhlcmUgd2FzIGluZm9ybWF0aW9uIGZvciBtb3N0IGluZGl2aWR1YWxzIGluIHRoZSBtZXRhLWFuYWx5c2lzICgyMC43IGFuZCAyMy43IE0gU05QcyBmb3IgbWV0YS1BRlIgYW5kIG1ldGEtQUxMIHJlc3BlY3RpdmVseSkuCgpGb3IgVUtCQl9ldXIsIHdlIHJldGFpbmVkIG9ubHkgU05QcyB3aXRoIElORk8+IDAuOCAoMTEuOSBNIFNOUHMpIGFuZCBsb3dfcXVhbGl0eV92YXJpYW50PUZBTFNFICgxNS40IE0gU05QcykuIE9ubHkgYXV0b3NvbWFsIFNOUHMgd2VyZSBhbmFseXplZC4gCgojIyMgTEQgcmVmZXJlbmNlIHBhbmVscwoKRm9yIFBSUyB1c2luZyBzdW1tYXJ5IHN0YXRpc3RpY3MgZnJvbSB0aGUgVUtCQl9ldXIsIHdlIHVzZWQgdGhlIFVLQkJfZXVyICg1LDAwMCByYW5kb21seSBzYW1wbGVkKSBpbXB1dGVkIGRhdGEgYXMgTEQgcmVmZXJlbmNlIHBhbmVsLkZvciBQUlMgdXNpbmcgdGhlIEJCSiBzdW1tYXJ5IHN0YXRpY3RpY3MsIHdlIHVzZWQgYSBjb21iaW5hdGlvbiBvZiB0aGUgMTAwMEcgUGhhc2UgMyBFYXN0IEFzaWFucyBhbmQgVUtCQiBDaGluZXNlIGluZGl2aWR1YWxzLiBGb3IgdGhlIG1ldGEtQUZSIHN1bW1hcnkgc3RhdGlzdGljcywgd2UgdXNlZCBhIGNvbWJpbmF0aW9uIG9mIFVLQkJfYWZyIGFuZCAxMDAwRyBQaGFzZSAzIEFmcmljYW4gYW5jZXN0cnkgaW5kaXZpZHVhbHMuIEZvciB0aGUgbWV0YS1BTEwgc3VtbWFyeSBzdGF0aXN0aWNzLCB3ZSB1c2VkIGEgY29tYmluYXRpb24gb2YgYWxsIFBoYXNlIDMgMTAwMEcgaW5kaXZpZHVhbHMsIHRoZSBVS0JCX2V1ciwgVUtCQl9hZnIsIGFuZCBVS0JCX2NoaS4gSW4gYWxsIGNhc2VzLCB0aGUgY29tYmluZWQgc2V0cyB3ZXJlIFFDJ2QgdG8gb25seSBpbmNsdWRlIHVucmVsYXRlZCBpbmRpdmlkdWFscyAocGxpbmsgLS1yZWwtY3V0b2ZmIDAuMTI1KSBhbmQgd2l0aCBnZW5vdHlwZSBtaXNzaW5nbmVzcyA8IDAuODUuIFdlIGZ1cnRoZXIgcmVzdHJpY3RlZCB0aGVzZSBzZXRzIHRvIFNOUHMgd2l0aCBNQUYgPiAwLjAwMS4gV2UgZnVydGhlciByZW1vdmVkIFNOUHMgd2l0aCBhbGxlbGljIG1pc21hdGNoIHdpdGggdGhlIFVLQkJfRVVSIHN1bW1hcnkgc3RhdGlzdGljcyBmaWxlIGFuZCBjb3JyZWN0ZWQgZm9yIHN0cmFuZCBmbGlwcGluZyB3aGVuIGFwcHJvcHJpYXRlLiAKCiMjIyBUZXN0IGRhdGEKCkZvciB0ZXN0IGRhdGEsIHdlIHVzZWQgdGhlIFBlbm4gQmlvYmFuayBzdWJzZXRzIG9mIEV1cm9wZWFuIEFtZXJpY2FuIGFuZCBBZnJpY2FuIEFtZXJpY2FuIGluZGl2aWR1YWxzIChUYWJsZSBYWCksIHRoZSBIUlMgc3Vic2V0cyBvZiBFdXJvcGVhbiBhbmQgQWZyaWNhbiBBbWVyaWNhbnMsIGFuZCB0aGUgVUtCQiBDaGluZXNlIGluZGl2aWR1YWxzIChUYWJsZSBYWCkuIApJbmRpdmlkdWFscyB3aXRoIGhlaWdodCBmdXJ0aGVyIHRoYW4gdHdvIGRldmlhdGlvbnMgZnJvbSB0aGUgc2V4LWNvaG9ydCBzcGVjaWZpYyBtZWFuIHdlcmUgbm90IGluY2x1ZGVkLiAoVGFibGUgMykKCiMjIFRlc3QgY29ob3J0cwoKIEdlbm90eXBlIGRhdGEgZnJvbSB0ZXN0IGNvaG9ydHMgd2FzIGxpZnRlZCBvdmVyIHRvIGhnMzggd2hlbiBuZWVkZWQuIAoKKiBQTUJCIChQZW5uIEJpb2JhbmspOiB3aXRoIHNldHMgb2YgRVVSICg3NTAxKSBhbmQgQUZSIGFuY2VzdHJ5IGluZGl2aWR1YWxzICg5MjI2KQoKKiBVS0JfQ0hJIChVS0JCIENoaW5lc2UpOiBhIHNldCBvZiAxLDUwNCBpbmRpdmlkdWFscyB3aXRoIENoaW5lc2UgYW5jZXN0cnkgZnJvbSB0aGUgVUsgQmlvYmFuay4KCiogSFJTIChIZWFsdGggYW5kIFJldGlyZW1lbnQgU3R1ZHkpOiB3aXRoIHNldHMgb2YgRVVSICgxMCw0ODYpIGFuZCBBRlIgKDIsMzIyKSBhbmNlc3RyeSBpbmRpdmlkdWFscy4KCldlIHZpc3VhbGx5IGluc3BlY3RlZCBxcS1wbG90cyBvZiBoZWlnaHQgcmVzaWR1YWxzIGZvciBlYWNoIGRhdGFzZXQgdG8gY2hlY2sgZm9yIGV4dHJlbWUgb3V0bGllcnMuIEJhc2VkIG9uIHRoaXMgaW5zcGVjdGlvbiwgd2UgcmVzdHJpY3RlZCBQTUJCIChGaWdzIDMtNCBmb3IgYmVmb3JlIGFuZCBhZnRlciBmaWx0ZXJpbmcpIGFuZCBIUlMgKEZpZ3MgNS02IGZvciBiZWZvcmUgYW5kIGFmdGVyIGZpbHRlcmluZykgc2FtcGxlcyB0byB0aG9zZSBmb3Igd2hpY2ggcmVzaWR1YWwgaGVpZ2h0IHdhcyBiZXR3ZWVuICRccG0zJCBzdGFuZGFyZCBkZXZpYXRpb25zIGZyb20gdGhlIG1lYW4gZm9yIGVhY2ggc2V4LiBGb3IgVUtCLUNISSwgbm8gZmlsdGVyaW5nIHdhcyBuZWNlc3NhcnkgKEZpZyA3KS4gSGVpZ2h0IHJlc2lkdWFscyB3ZXJlIG9idGFpbmVkIGJ5IHJlZ3Jlc3NpbmcgaGVpZ2h0IG9uIGFsbCBjby12YXJpYXRlcyBhbmQgdGhlaXIgaW50ZXJhY3Rpb25zIGZvciBlYWNoIGluZGl2aWR1YWw6CgokJGhlaWdodFxzaW0gU2V4K0FnZStBZ2VeMitTZXgqQWdlK1NleCpBZ2VeMitwRVVSK1NleCpwRVVSK0FnZSpwRVVSK0FnZV4yKnBFVVIkJCAKCiwgd2hlcmUgJHBfe0VVUn0kIGlzIHRoZSBnZW5vbWUtd2lkZSBhdmVyYWdlIHByb3BvcnRpb24gb2YgRXVyb3BlYW4gYW5jZXN0cnkgZm9yIFBNQkJfYWZyIGFuZCBIUlNfYWZyIChlc3RpbWF0ZWQgdGhyb3VnaCBSRk1JeCksIGFuZCB0aGUgRXVyb3BlYW4gYW5jZXN0cnkgY29tcG9uZW50IChlc3RpbWF0ZWQgdGhyb3VnaCB1bnN1cGVydmlzZWQgQURNSVhUVVJFIHdpdGggaz0yKSBmb3IgVUtCX0NISS4gRm9yIEhSU19ldXIgYW5kIFBNQkJfZXVyLCB3ZSBzZXQgJHBfe0VVUn0kIHRvIDEuIAoKV2hlbiBtdWx0aXBsZSB0aW1lIHBvaW50cyB3ZXJlIGF2YWlsYWJsZSBmb3IgZWFjaCBpbmRpdmlkdWFsLCB3ZSByZXRhaW5lZCB0aGUgb25lIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGxhdGVzdCBoZWlnaHQgbWVhc3VyZSBhbmQgYWdlLiBBbGwgaGVpZ2h0IHBoZW5vdHlwZSBkYXRhIHdhcyBmb3JtYXR0ZWQgdG8gYmUgaW4gY2VudGltZXRlcnMuIAoKRWFjaCB0ZXN0IGNvaG9ydCB3YXMgcmFuZG9tbHkgZGl2aWRlZCBpbnRvIGEgInRyYWluIiBhbmQgYSAidGVzdCIgc2V0IGZvbGxvd2luZyB0aGUgcmF0aW8gb2YgMC4xNSAodHJhaW4pIGFuZCAwLjg1ICh0ZXN0KSBmb3IgbW9zdCBkYXRhc2V0cywgZXhjZXB0IGZvciBVS0JfQ0hJIGFuZCBIUlNfYWZyLCB3aGVyZSB3ZSB1c2VkIDAuMjA6MC44MCAoVGFibGUgMikuIFdlIHBlcmZvcm1lZCBhIHN0cmF0aWZpZWQgc3BsaXQgb2YgdGhlIGRhdGEgdXNpbmcgdGhlIGluaXRpYWxfc3BsaXQgZnVuY3Rpb24gZnJvbSB0aGUgcnNhbXBsZSBSIHBhY2thZ2UuIFdlIHVzZWQgJ1NleCcgYXMgc3RyYXRlLCBpLmUsIHRvIG1haW50YWluIFNleCBwcm9wb3J0aW9ucyB3aXRoaW4gdHJhaW5pbmcgYW5kIHRlc3Rpbmcgc2V0cyBzaW1pbGFyIChUYWJsZSAyKQoKIyMjIFBSUyBjYWxjdWxhdGlvbnMKCldlIHVzZWQgTERwcmVkIGZvciBQUlMgY2FsY3VsYXRpb25zLiBGb3IgVUtCQl9ldXIgc3VtbWFyeSBzdGF0aXN0aWNzLCB3ZSB1c2VkIHRoZSBVS0JCX2V1ciBhcyBMRCByZWZlcmVuY2UgcGFuZWw7IGZvciBCQkogYW5kIG1ldGEtQUZSIHdlIHVzZWQgRWFzdCBBc2lhbnMgYW5kIEFmcmljYW5zIGZyb20gMTAwMEcgUGhhc2UgMywgcmVzcGVjdGl2ZWx5LiBXZSBmaXJzdCByYW4gbGRwcmVkIGNvb3JkIHRvIGNvb3JkaW5hdGUgdGhlIHN1bW1hcnkgc3RhdGlzdGljcywgdGVzdCBhbmQgTEQgZGF0YXNldHMuIE5leHQgd2UgcmFuIHRoZSBnaWJicyBzYW1wbGVyLiBNYW55IHZhbHVlcyBvZiBwIGRpZCBub3QgY292bmVyZ2UsIGJ1dCB0eXBpY2FsbHkgcD0xIGFuZCBwPTAuMyBkaWQgY29udmVyZ2UsIHNvIHdlIGxvb2tlZCBhdCB0aG9zZSwgYXMgd2VsbCBhcyB0aGUgaW5maW5pdGVzaW1hbCBtb2RlbC4gU2VlIFRhYmxlIAoKUFJTX2V1cjogUFJTIHVzaW5nIGVmZmVjdCBzaXplcyAoJFxiZXRhJCkgZnJvbSBVS0JCX2V1ci4gCgpQUlNfZWFzOiBQUlMgdXNpbmcgZWZmZWN0IHNpemVzICgkXGJldGEkKSBmcm9tIEJCSiAoYWxsIEVhc3QgQXNpYW4pLgoKUFJTX2FmcjogUFJTIHVzaW5nIGVmZmVjdCBzaXplcyAoKCRcYmV0YSQpIGZyb20gdGhlIG1ldGEtQUZSIEdXQVMuCgpQUlNfYWxsOiBQUlMgdXNpbmcgZWZmZWN0IHNpemVzICgoJFxiZXRhJCkgZnJvbSB0aGUgbWV0YS1BTEwgR1dBUy4KCjEpIEEgc2ltcGxlIGxpbmVhciByZWdyZXNzaW9uIG1vZGVsCgoKJCRoZWlnaHR+U2V4K0FnZStBZ2UyK3BFVVIkJCAKCiQkaGVpZ2h0flNleCtBZ2UrQWdlMitwRVVSK1BSU197ZXVyfSQkIAoKCjIpIFBSUzFfTUwgKGRlc2NyaWJlZCBpbiBNYXJxdWV6LUx1bmEgZXQgYWwuIDIwMTcgYW5kIEJpdGFyZWxsbyAmIE1hdGhpZXNvbiAyMDIwKQoKMykgUFJTMl9CRCAtIGxpbmVhciBjb21iaW5hdGlvbiBvZiBQUlMgZGVzY3JpYmVkIGluIEJpdGFyZWxsbyAmIE1hdGhpZXNvbiAyMDIw